#include <sys/timerfd.h>
#include <iostream>
#include <strings.h>
#include <unistd.h>

int main()
{
    //创建一个定时器描述符，他的返回值是一个文件描述符，MONOTONIC代表相对时间,0代表阻塞属性
    int timefd=timerfd_create(CLOCK_MONOTONIC,0);
    if(timefd<0)
    {
        perror("timerfd_create");
        return 1;
    }

    struct itimerspec itime;
    //设置第一次超时时间为1秒
    itime.it_value.tv_sec=1;
    itime.it_value.tv_nsec=0;   //单位微妙

    //设置第一次之后的超时时间间隔
    itime.it_interval.tv_sec=3;
    itime.it_interval.tv_nsec=0;

    /*
    int timerfd_settime(int fd, int flags, struct itimerspec *new, struct
    itimerspec *old);
    fd: timerfd_create返回的⽂件描述符
    flags: 0-相对时间， 1-绝对时间；默认设置为0即可.
    new： ⽤于设置定时器的新超时时间
    old： ⽤于接收原来的超时时间
    */
    
    //成功时返回0,失败返回-1，设置errno码
    int n=timerfd_settime(timefd,0,&itime,nullptr); //启动定时器
    if(n<0)
    {
        perror("timerfd_settime");
        return 2;
    }

    while(1)
    {
        uint64_t times;
        n=read(timefd,&times,8);
        if(n<0)
        {
            perror("read");
            return 3;
        }

        std::cout<<"超时了，距离上一次超时了"<<times<<"次"<<std::endl;
    }

    close(timefd);
    return 0;
}